﻿/* ******************************************************** */
/* Arcans Project (2010)                                    */
/* Jeu sous forme d'application web entièrement conçu       */
/* et réalisé par Killian Le Maitre                         */
/* Jeu sous licence GNU GPL v3 (voir NOTICE et COPYING)     */
/* ******************************************************** */

//variables globales ******************************************************************************
var regval = new RegExp(/^[\w]+[\w\-\.]{2,}$/);
var regemail = new RegExp(/^[a-zA-Z0-9]+([_|\.|-]{1}[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([_|\.|-]­{1}[a-zA-Z0-9]+)*[\.]{1}[a-z]{2,6}$/);
var ajax;

//gestion de l'encart et du voile *****************************************************************
var EncartClass = function () {
	//propriétés :
	this.encart = document.getElementById("encart");
	this.voile = document.getElementById("voile");
	this.title_div;
	this.head_div;
	this.alert_div;
	this.table_div;
	this.foot_div;
	//méthodes :
		//ouverture de l'encart
	this.ouverture = function (taille, titre) {
		window.scrollTo(0,0);
		document.body.style.overflow = "hidden";
		this.voile.style.display = "block";
		this.encart.style.display = "block";
		for (var i = 0;i < 9;i++) window.setTimeout("document.getElementById('voile').style.opacity = 0." + i, 50*i);
		this.encart.style.top = "-300px";
		this.encart.style.left = "550px";
		this.encart.style.width = taille;
		for (var i = 0;i < 9;i++) {
			var temp = -400 + i*55;
			window.setTimeout("document.getElementById('encart').style.top = '" + temp + "px';", 50*i);
		}
		this.title_div = document.createElement("h3");
		this.title_div.appendChild(document.createTextNode(titre));
		this.encart.appendChild(this.title_div);
		this.head_div = document.createElement("div");
		this.encart.appendChild(this.head_div);
		this.alert_div = document.createElement("div");
		this.encart.appendChild(this.alert_div);
		this.table_div = document.createElement("table");
		this.encart.appendChild(this.table_div);
		this.foot_div = document.createElement("div");
		this.encart.appendChild(this.foot_div);
	}
		//création de paragraphes d'entête
	this.addHeadPara = function (valeur) {
		var crea_para = document.createElement("p");
		crea_para.appendChild(document.createTextNode(valeur));
		this.head_div.appendChild(crea_para);
	}
		//mise à zéro de l'entete
	this.resetHeader = function () { while (this.head_div.hasChildNodes()) this.head_div.removeChild(this.head_div.firstChild); }
		//mise à jour de l'alerte, paragraphes
	this.alerte = function (classe, texte) {
		var crea_para = document.createElement("p");
		crea_para.setAttribute("class", classe);
		crea_para.appendChild(document.createTextNode(texte));
		this.alert_div.appendChild(crea_para);
	}
		//mise à jour de l'alerte, liens
	this.alerteLien = function (lien, texte, fonction) {
		var crea_para = document.createElement("p");
		var crea_lien = document.createElement("a");
		crea_lien.setAttribute("href", lien);
		if (fonction != "") crea_lien.setAttribute("onclick", fonction);
		crea_lien.appendChild(document.createTextNode(texte));
		crea_para.appendChild(crea_lien);
		this.alert_div.appendChild(crea_para);
	}
		//mise à zéro de l'alerte, si besoin
	this.resetAlerte = function () { while (this.alert_div.hasChildNodes()) this.alert_div.removeChild(this.alert_div.firstChild); }
		//mise à zéro du tableau
	this.resetTable = function () { while (this.table_div.hasChildNodes()) this.table_div.removeChild(this.table_div.firstChild); }
		//création de lignes à label + input + bouton
	this.addLigne = function (id, libel, type_input, bouton, fonction) {
		var crea_cell = document.createElement("td");
		var crea_row = document.createElement("tr");
		var crea_label = document.createElement("label");
		crea_label.setAttribute("for", id);
		crea_label.appendChild(document.createTextNode(libel));
		crea_cell.appendChild(crea_label);
		crea_row.appendChild(crea_cell);
		crea_cell = document.createElement("td");
		var crea_input = document.createElement("input");
		if (id != "email") crea_input.setAttribute("maxlength", "15");
		crea_input.setAttribute("type", type_input);
		crea_input.setAttribute("id", id);
		crea_cell.appendChild(crea_input);
		crea_row.appendChild(crea_cell);
		if (bouton != "") {
			crea_cell = document.createElement("td");
			var crea_button = document.createElement("button");
			crea_button.setAttribute("onclick", fonction);
			crea_button.appendChild(document.createTextNode(bouton));
			crea_cell.appendChild(crea_button);
			crea_row.appendChild(crea_cell);
		}
		this.table_div.appendChild(crea_row);
	}
		//mise à zéro du footer
	this.resetFooter = function () { while (this.foot_div.hasChildNodes()) this.foot_div.removeChild(this.foot_div.firstChild); }
		//création de boutons dans le pied du panel
	this.addFootBouton = function (valeur, fonction) {
		var crea_button = document.createElement("button");
		crea_button.setAttribute("onclick", fonction);
		crea_button.appendChild(document.createTextNode(valeur));
		this.foot_div.appendChild(crea_button);
	}
		//création de lien dans le pied du panel
	this.addFootLien = function (lien, texte, fonction) {
		var crea_para = document.createElement("p");
		var crea_lien = document.createElement("a");
		crea_lien.setAttribute("href", lien);
		if (fonction != "") crea_lien.setAttribute("onclick", fonction);
		crea_lien.appendChild(document.createTextNode(texte));
		crea_para.appendChild(crea_lien);
		this.foot_div.appendChild(crea_para);
	}
		//fermeture de l'encart
	this.fermeture = function () {
		for (i = 0; i < 9; i++) {
			window.setTimeout("document.getElementById('voile').style.opacity = 0." + (8 - i), 50*i);
			var temp = 40 - i*55;
			window.setTimeout("document.getElementById('encart').style.top = '" + temp + "px';", 50*i);
		}
		window.setTimeout("encart.suppression();", 390);
		window.setTimeout("document.getElementById('voile').style.display = 'none'", 400);
		window.setTimeout("document.getElementById('encart').style.display = 'none'", 400);
		document.body.style.overflow = "auto";
	}
		//suppression des éléments du panel
	this.suppression = function () {
		this.encart.removeChild(this.title_div);
		this.encart.removeChild(this.head_div);
		this.encart.removeChild(this.alert_div);
		this.encart.removeChild(this.table_div);
		this.encart.removeChild(this.foot_div);
	}
}

//gestion de l'ajax *******************************************************************************
try { var ajax = new ActiveXObject('Msxml2.XMLHTTP'); }
catch (e) {
	try { var ajax = new ActiveXObject('Microsoft.XMLHTTP'); }
	catch (e2) { try { var ajax = new XMLHttpRequest(); } catch (e3) { ajax = false; } }
}
var ajaxFun = function (address, nb_param, tab_param, fonction_res) {
	//ajax fonction
	ajax.onreadystatechange = function() {
		if (ajax.readyState == 4) {
			if (ajax.status == 200) {
				if (fonction_res != "") {
					result = ajax.responseXML;
					infos = result.getElementsByTagName("infos").item(0);
					if (infos.getAttribute("type") == "text") fonction_res(parseInt(infos.getAttribute("value")));
					else if (infos.getAttribute("type") == "xml") fonction_res(result);
				}
			}
		}
	}
	//lancement de l'ajax
	ajax.open( "POST", "?p=" + address,  true);
	ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	var donnees = "";
	for (var ident = 0; ident < nb_param; ident++) {
		if (ident != 0) donnees = donnees + "&";
		donnees = donnees + "info" + ident + "=" + tab_param[ident];
	}
	ajax.send(donnees);
}

//gestion du hashage ******************************************************************************
//extension de la fonction toHexStr de la classe Number
Number.prototype.toHexStr = function() {
	var s="", v;
	for (var i=7; i>=0; i--) { v = (this>>>(i*4)) & 0xf; s += v.toString(16); }
	return s;
}
//fonctions nécessaires pour le hashage
function ROTR(n, x) { return (x >>> n) | (x << (32-n)); }
function Sigma0(x) { return ROTR(2,  x) ^ ROTR(13, x) ^ ROTR(22, x); }
function Sigma1(x) { return ROTR(6,  x) ^ ROTR(11, x) ^ ROTR(25, x); }
function sigma0(x) { return ROTR(7,  x) ^ ROTR(18, x) ^ (x>>>3); }
function sigma1(x) { return ROTR(17, x) ^ ROTR(19, x) ^ (x>>>10); }
function Ch(x, y, z)  { return (x & y) ^ (~x & z); }
function Maj(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); }
//fonction de hashage
var hashFun = function (chaine) {
	var K = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
	var H = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];
	chaine += String.fromCharCode(0x80);
	var l = chaine.length/4 + 2;
	var N = Math.ceil(l/16);
	var M = new Array(N);
	for (var i=0; i<N; i++) {
		M[i] = new Array(16);
		for (var j=0; j<16; j++)
			{ M[i][j] = (chaine.charCodeAt(i*64+j*4)<<24) | (chaine.charCodeAt(i*64+j*4+1)<<16) | (chaine.charCodeAt(i*64+j*4+2)<<8) | (chaine.charCodeAt(i*64+j*4+3)); }
	}
	M[N-1][14] = ((chaine.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14])
	M[N-1][15] = ((chaine.length-1)*8) & 0xffffffff;
	var W = new Array(64);
	var a, b, c, d, e, f, g, h;
	for (var i=0; i<N; i++) {
		for (var t=0;  t<16; t++) { W[t] = M[i][t]; }
		for (var t=16; t<64; t++) { W[t] = (sigma1(W[t-2]) + W[t-7] + sigma0(W[t-15]) + W[t-16]) & 0xffffffff; }
		a = H[0]; b = H[1]; c = H[2]; d = H[3]; e = H[4]; f = H[5]; g = H[6]; h = H[7];
		for (var t=0; t<64; t++) {
			var T1 = h + Sigma1(e) + Ch(e, f, g) + K[t] + W[t];
			var T2 = Sigma0(a) + Maj(a, b, c);
			h = g; g = f; f = e; e = (d + T1) & 0xffffffff; d = c; c = b; b = a; a = (T1 + T2) & 0xffffffff;
		}
		H[0] = (H[0]+a) & 0xffffffff; H[1] = (H[1]+b) & 0xffffffff; H[2] = (H[2]+c) & 0xffffffff; H[3] = (H[3]+d) & 0xffffffff; 
		H[4] = (H[4]+e) & 0xffffffff; H[5] = (H[5]+f) & 0xffffffff; H[6] = (H[6]+g) & 0xffffffff; H[7] = (H[7]+h) & 0xffffffff;
	}
	return H[0].toHexStr() + H[1].toHexStr() + H[2].toHexStr() + H[3].toHexStr() + H[4].toHexStr() + H[5].toHexStr() + H[6].toHexStr() + H[7].toHexStr();
}

//gestion des affichages / masquage ***************************************************************
var aff_masq = function (div_name,bouton_name,type,choix) {
	var div_op = document.getElementById(div_name);
	var bouton = document.getElementById(bouton_name);
	var texte = ""; var disp = "";
	if (choix == "a") { texte = "Masquer "; disp = "block"; choix = "m"; }
	else { texte = "Afficher "; disp = "none"; choix = "a"; }
	div_op.style.display = disp;
	bouton.setAttribute("onclick", "javascript:aff_masq('"+ div_name +"','"+ bouton_name +"','"+ type +"','"+ choix +"');");
	bouton.removeChild(bouton.firstChild);
	switch (type) {
		case "obj" : texte = texte + "les objectifs"; break;
	}
	bouton.appendChild(document.createTextNode(texte));
}